import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['axes.unicode_minus'] = False
mpl.rcParams['font.sans-serif']=['SimHei']

import seaborn as sns
import tushare as ts

import index_jj as ijj

# sh = ts.get_k_data(code='600986', ktype= 'D', autype= 'qfq')
# print(sh.head(5))

# 画出折线图， 是 DataFrame 的plot画图功能，其中
# 如果直接 sh.plot 那就是将每列画一根线，x轴刻度取默认的index
# 如果指定了index，可以选择画出一个线与index的关系。
"""
sh.index = pd.to_datetime(sh.date)
sh['close'].plot(figsize=(12,6))
plt.show()
"""

# 统计 本次 DataFrame 概览数据
"""
sh.info()
"""

"""
对所有数据的描述 round(2) 代表保留2位小数
mean -- 本批数据的均值
std  -- 标准差
min  -- 最小值
max  -- 最大值
"""
# print(sh.describe().round(2))

"""
成交量的折线图
"""
# sh.index = pd.to_datetime(sh.date)
# sh["volume"].plot(figsize=(12,6))
# plt.title("2021-2022")
# plt.xlabel('日期')
# plt.show()


"""
设置均线
ma20是短期均线系统中参数最大的一种移动平均线 - 意义在于它反映了这支股票20天的平均成本
MA20 - 它表示过去20个交易日的平均价格   -  具体说的是某支股票在市场上往前20天的平均收盘价格
DataFrame.rolling(N).mean() 就是某个时间序列数据，按求 N 的大小的均值。
其中 mean() 函数是返回窗口的均值。
"""
# sh.index = pd.to_datetime(sh.date)
# ma_day = [20, 50, 100]
# for ma in ma_day:
#     column_name = "MA{0}".format(ma)
#     sh[column_name] = sh["close"].rolling(ma).mean()
# sh[["close", "MA20", "MA50", "MA100"]].plot(figsize=(12, 6))
# plt.show()



"""
日收益率可视化
pct_change : 此函数用于计算一系列值的变化百分比。
            假设我们有一个包含[2,3,6]的序列。如果我们对这个序列应用pct_change
            则返回的序列将是[NaN,0.5,1.0]。从第一个元素到第二个元素增加了50%
            从第二个元素到第三个元素增加了100%。Pct_change函数用于比较元素时间序列中的变化百分比
"""
# sh.index = pd.to_datetime(sh.date)
# sh["日收益率"] = sh["close"].pct_change()
# # sh["日收益率"].plot(figsize=(12, 4))
# # 在上述的基础上，进行改变线条的显示和加一些标记
# sh["日收益率"].plot(figsize=(12, 4),linestyle="--",marker="o",color="g")
# plt.xlabel('日期')
# plt.ylabel('日收益率')
# plt.show()


"""
多个股票可视化分析 - tushare 数据源
"""
# stocks = {'上证指数':'sh', '深证指数':'sz','沪深300':'hs300','上证50':'sz50'}
# stock_index = pd.DataFrame()
# for stock in stocks.values():
#     stock_index[stock] = ts.get_k_data(stock, ktype="D", autype= 'qfq', start='2021-01-01')['close']

"""
使用掘金量化 数据源
"""
# stocks = {'上证指数':'SHSE.000001', '深证指数':'SZSE.399001','沪深300':'SZSE.399300'}
# stock_index = pd.DataFrame()
# for stock in stocks.values():
#     stock_index[stock] = ijj.get_his_data(stock,"2010-01-01", "2020-12-31")['close']

#计算每日涨跌幅
# tech_rets = stock_index.pct_change()[1:]
# print(tech_rets.describe())
# print(tech_rets.mean()*100)

# 对上述的股票的相关性进行可视化分析
"""
相关性的学习 https://zhuanlan.zhihu.com/p/465213120
相关性是两个变量线性相关的程度。从广义上讲，相关性实际上是双变量数据中两个随机变量之间的任何统计关系，无论是否因果关系
相关性的衡量  +1 完全正相关 -1 完全负相关 0 - 完全不相干。
"""
# sns.jointplot(x='SHSE.000001',y='SZSE.399001',data=tech_rets)
# plt.show()

"""
计算股票的收益率和风险
进行对比多支股票的收益和风险
DataFrame.dropna() 删除包含缺失值的行
DataFrame.mean() 计算每列的平均值
"""

# 先构建一个计算股票的收益率和标准差的函数
def return_risk(stocks, startTime='2019-01-01'):
    closeDf = pd.DataFrame()
    for stock in stocks.values():
       closeDf[stock] = ijj.get_his_data(stock, start_time=startTime,end_time='2023-12-4')['close']
    tech_rets = closeDf.pct_change()[1:]
    rets = tech_rets.dropna()
    ret_mean = rets.mean()*100
    ret_std = rets.std()*100
    return ret_mean, ret_std

def plot_return_risk():
    stocks = {'北汽蓝谷':'SHSE.600733','比亚迪':'SZSE.002594'}
    ret_main, ret_std = return_risk(stocks=stocks)
    color =np.array([0.18, 0.96])
    plt.scatter(ret_main, ret_std, marker='o', c=color, s = 500, cmap=plt.get_cmap('Spectral'))
    plt.xlabel('日收益率均值%')
    plt.ylabel("标准差%")
    for labal,x,y in zip(stocks.keys(), ret_main, ret_std):
        plt.annotate(labal, xy=(x, y), xytext=(20,20),
                     textcoords="offset points",
                     ha = "right", va = 'bottom',
                     bbox = dict(boxstyle = 'round, pad=0.5',fc='yellow',alpha=0.5),
                     arrowprops= dict(arrowstyle = "->", connectionstyle="arc3, rad=0"))
    plt.show()
plot_return_risk()
     





